﻿using AutoMapper;
using RestApp.UI.Core;
using RestApp.UI.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace RestApp.UI.Controllers
{
	[Authorize]
	public class CalendarController : Controller
	{
		private IBusinessFactory _factory;
		public CalendarController(IBusinessFactory factory)
		{
			_factory = factory;
		}

        public ActionResult CurrentUserCalendar()
        {
            var currentUser = _factory.UsersLogic.GetByLogin(User.Identity.Name);
            var mappedUser = Mapper.Map<RestApp.UI.Models.User>(currentUser);
            return View("Graphic", mappedUser);
        }

        public ActionResult CurrentUserJobFacts()
        {
            var currentUser = _factory.UsersLogic.GetByLogin(User.Identity.Name);
            return RedirectToAction("FillFacts", "JobFacts", new { id = currentUser.Id });
        }

		public ActionResult Graphic(int id)
		{
            var user = _factory.UsersLogic.GetById(id);
            var mappedUser = Mapper.Map<RestApp.UI.Models.User>(user);
            return View(mappedUser);
		}

		[HttpPost]
        [Authorize(Roles="Manager")]
		public JsonResult AddGraphic(WorkGraphic graphic)
		{
			if (!ModelState.IsValid)
			{
				return Json(new { error = "Неправильные данные. Пожалуйста, обновитье страницу и попробуйте снова." });
			}
			var mapedEntity = graphic.ToBusinessEntity();
			try
			{
				_factory.WorkGraphicLogic.Add(mapedEntity);
			}
			catch (Exception)
			{
				return Json(new { error = "Не удалось добавить данные в базу данных. Пожалуйста, попробуйте обновить страницу" });
			}
			return Json(new { id = mapedEntity.Id });
		}

		[HttpPost]
        [Authorize(Roles = "Manager")]
		public JsonResult EditGraphic(WorkGraphic graphic)
		{
			if (!ModelState.IsValid)
			{
				return Json(new { error = "Неправильные данные. Пожалуйста, обновитье страницу и попробуйте снова." });
			}
			var mapedEntity = graphic.ToBusinessEntity();
			try
			{
				_factory.WorkGraphicLogic.Edit(mapedEntity);
			}
			catch (Exception)
			{
				return Json(new { error = "Не удалось изменить данные. Пожалуйста, попробуйте обновить страницу" });
			}
			return Json(new { success = true });
		}

		[HttpPost]
        [Authorize(Roles = "Manager")]
		public JsonResult Remove(int id)
		{
			try
			{
				_factory.WorkGraphicLogic.RemoveById(id);
			}
			catch (Exception)
			{
				return Json(new { error = "Не удалось удалить объект. Пожалуйста, попробуйте обновить страницу" });
			}
			return Json(new { success = true });
		}

        public JsonResult CheckIfEventExists(int year, int month, int day, int idUser)
        {
            try
            {
                bool exists = _factory.WorkGraphicLogic.IfEventExists(year, month, day, idUser);
                return Json(new { exists = exists }, JsonRequestBehavior.AllowGet);
            } 
            catch(Exception)
            {
                return Json(new { exists = true, message = "Произошла ошибка. Попробуйте обовить страницу." }, JsonRequestBehavior.AllowGet);
            }
        }
	}
}